揭秘网络中心人物,你会是其中之一吗?
本文作者:罗天尧,新疆大学商学院
本文编辑:郭泽源
技术总编:方一卓
Stata and Python 数据分析
爬虫俱乐部Stata基础课程、Stata进阶课程和Python课程可在小鹅通平台查看,欢迎大家多多支持订阅!如需了解详情,可以通过课程链接(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或课程二维码进行访问哦~随着研究的精细化与计算机的提升,越来越多的学者建立了以网络视角为主的研究方法。El-Khatib et al(2015)构建CEO网络中心性,通过衡量CEO个人关系的广度和强度,发现高网络中心性的CEO会发起更频繁的并购,且对并购双方造成了巨大的价值损失。类似地,孟雪辰等(2022)构建以城市距离与经济联系强度的网络中心性指标,研究了高铁开通对城市网络中心性的影响。陈玥莹等(2022)以青岛市主城区为样本,分析道路网络中心性及餐饮业空间分布特征。这些研究均从网络化视角构建样本,通过量化系统内的元素链接,分析对象间的作用关系。
以往的相关研究大都依赖Ucinet等模拟软件的实现,本文则通过可读性更强的Python语言完成,同时附上Stata软件的实现思路;为了可视化更强的代码呈现,本文推荐使用Anoconda环境下的jupyter编译器完成。
何为网络中心度呢?早在1978年,L.C. Freeman首次提出用degree来衡量网络中心度,其中网络中心度(cc)是用来量化节点网络中一个节点的重要程度。
为了简化degree这一概念,参考易其国等(2021)的网络中心度计算公式,其中cc为中心度,Ri,j为点间的连接度,n为点的总数。
度中心度(Degree),是在网络分析中刻画网络中心度(cc)最直接的指标。一个节点的节点度越大就意味着这个节点的度中心性越高,该节点在网络中就越重要。在不考虑权重与方向的情形下,“度”就是每个点与其余点的连线个数,即上式中的
igraph 是一组网络分析工具,集成了网络分析的诸多功能,可以在 R, Python, C/C+ 平台上使用。igraph内置了众多网络分析的计算方法,因此我们可以通过igraph来简化Python的计算操作。
在命令框键入并运行安装igraph模块。
pip install igraph
同时为了生成可视化的图像,需要提前安装pycairo库。
conda install pycairo
尝试运行如下命令:
import igraph as ig #导入igraph模块,并以ig命名
g=ig.Graph(n=4,edges=[[0,1],[0,2],[1,3],[2,1]]) #ig.Graph是一个关系网络对象,n代表元素个数;使用者可以根据各点的连接关系,通过edges连接线
print(g)
ig.plot(g,bbox=(300,300)) #ig.plot()则是画图命令,g是需要绘制的对象,bbox是图例大小。
输出的结果为:
值得注意的是,igraph里许多方法的传参都是通过数组、字典等格式实现的,实际中我们也可以借助这一特性操作。
同时,igraph内置了众多经典网络连接图,我们可以通过Famous方法轻松调用。
petersen = ig.Graph.Famous("petersen")
ig.plot(petersen)
参考易其国等(2021)的网络中心度计算公式,其中cc为中心度,Ri,j为点间的连接度,n为点的总数。
我们先构建一个简单的关系网络用于测试。
g=ig.Graph(directed=True) #方向
g.add_vertices(5) #添加对象
edges=[[0,1],[0,2],[0,3],[1,2],[1,4]] #二位数组形式输入连接线;以0开始
g.add_edges(edges) #添加连接线
g.vs["name"] = ["A", "B", "C", "D", "E"] #命名,修改方法内部参数的形式。
g.vs["label"] = g.vs["name"] #赋名
ig.plot(g)
假设下图是我们识别到的关系网络。
实际研究中,我们通常会先将图像转换为数据,使计算机读懂网络的内部关系。这里以Dataframe格式为例。
import pandas as pd
df=pd.DataFrame(data=[["A","B"],["A","C"],["A","D"],["B","C"],["B","E"],],columns=["start","end"])
df
df.groupby('start').sum()
输出的Dataframe数据。
如果我们直接以Dataframe的格式来计算中心度的话会稍显繁琐。在不断修改后,代码依旧显得冗长。
import pandas as pd
import numpy as np
df = pd.DataFrame(data=[["A","B"],["A","C"],["A","D"],["B","C"],["B","E"],],columns=['start','end'])
# 计算节点总数
unique_letters = set(''.join(df['start']) + ''.join(df['end']))
total = len(unique_letters)
#分别以start,end合并,互为起始点
df2 = pd.DataFrame()
df2['start'] = pd.concat([df['start'], df['end']])
df2['end'] = pd.concat([df['end'], df['start']])
dic1 = df2.groupby('start')['end'].apply(lambda x: len(set(''.join(x)))).to_dict() #去重生成字典,以start为分组依据
#循环计算
for key, value in dic1.items():
cc = value / (total - 1)
print(f'{key}的cc是{cc}')
计算结果:
igraph为我们提供了一个更为简便的方法。通过igraph内置的度(degree)和节点总数(vcount)数据计算即可。如还需引入方向或权重的计算,使用者可进一步设置igraph的参数和计算方法。
import numpy as np
np.array(g.degree())/(g.vcount()-1)
计算结果如下:
Stata的计算思路与上文Dataframe的计算思路类似。
ssc install egenmore,replace
clear
input str1(start end)
"A" "B"
"A" "C"
"A" "D"
"B" "C"
"B" "E"
"B" "A"
"C" "A"
"D" "A"
"C" "B"
"E" "B"
end
duplicates drop
sort start end
egen total = nvals(start)
bysort start:egen obs_num = nvals(end)
gen cc=obs_num/(total-1)
by start:list cc
除了上述方法,Stata还可通过矩阵进行计算,或通过frame思路解决(详见爬虫俱乐部课程《谁是班上最popular的人?》)。
参考文献:
[1]El-Khatib, R., Fogel, K., & Jandik, T. (2015). CEO network centrality and merger performance. Journal of Financial Economics, 116(2), 349–382.
[2]孟雪辰,林善浪.高铁开通对城市网络中心性影响的实证检验[J].统计与决策,2022,38(22):56-60.
[3]陈玥莹,陈延斌,殷冠文,宋成镇,侯毅鸣.道路网络中心性对餐饮业空间布局的影响——以青岛市主城区为例[J].地理科学,2022,42(09):1609-1618.
[4]易其国,马灿,丁锐.高铁对区域经济发展的空间溢出效应分析[J].统计与决策,2021,37(19):129-133.
重磅福利!为了更好地服务各位同学的研究,爬虫俱乐部将在小鹅通平台上持续提供金融研究所需要的各类指标,包括上市公司十大股东、股价崩盘、投资效率、融资约束、企业避税、分析师跟踪、净资产收益率、资产回报率、国际四大审计、托宾Q值、第一大股东持股比例、账面市值比、沪深A股上市公司研究常用控制变量等一系列深加工数据,基于各交易所信息披露的数据利用Stata在实现数据实时更新的同时还将不断上线更多的数据指标。我们以最前沿的数据处理技术、最好的服务质量、最大的诚意望能助力大家的研究工作!相关数据链接,请大家访问:(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或扫描二维码:
最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。
对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐【爬虫实战】Python爬取知网文献信息 爬虫俱乐部的精彩答疑---cntraveltime【爬虫俱乐部新命令速递】在Stata中与ChatGPT对话
用`fs`命令批量获取文件夹和不同文件夹下的excel文件
自然语言处理之实例应用JSON帮手,FeHelper
最新、最热门的命令这里都有!
Python实现微信自动回复告诉python,我想“狂飙”了——线程池与异步协程为爬虫提速高级函数——map()和reduce()Stata绘制条形图的进阶用法
快来看看武汉的房价是不是又双叒叕涨了!Python 常见内置函数(二)Stata绘制饼形图的进阶用法
Python标准库--logging模块盲区探索——Stata的读写极限Camelot提取PDF表格:一页多表、多页一表Stata绘图系列——条形图绘制
Python常见内置函数(一)Stata绘图系列——饼形图绘制关于我们
微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。
此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com投稿要求:1)必须原创,禁止抄袭;2)必须准确,详细,有例子,有截图;注意事项:1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。2)邮件请注明投稿,邮件名称为“投稿+推文名称”。3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。